<?php
if (!defined('BASEPATH')) exit('no direct script access allowd');
/**
 * PHP QR Code porting for Codeigniter
 *
 * @package        	CodeIgniter
 * @subpackage    	Libraries
 * @category    	Libraries
 * @porting author	dwi.setiyadi@gmail.com
 * @original author	http://phpqrcode.sourceforge.net/
 * 
 * @version		1.0
 */
 
class Ci_qrcode{
	
	public $cacheable;
	public $cachedir;
	public $errorlog;
	public $quality;
	public $size;
	
	function __construct($config = array()) {
		
		// call original library
		include __DIR__ . "/QRCode/qrconst.php";
		include __DIR__ . "/QRCode/qrtools.php";
		include __DIR__ . "/QRCode/qrspec.php";
		include __DIR__ . "/QRCode/qrimage.php";
		include __DIR__ . "/QRCode/qrinput.php";
		include __DIR__ . "/QRCode/qrbitstream.php";
		include __DIR__ . "/QRCode/qrsplit.php";
		include __DIR__ . "/QRCode/qrrscode.php";
		include __DIR__ . "/QRCode/qrmask.php";
		include __DIR__ . "/QRCode/qrencode.php";
		
		$this->initialize($config);
	}
	
	public function initialize($config = array()) {
		$this->cacheable = isset($config['cacheable']) ? $config['cacheable'] : true;
		$this->cachedir = isset($config['cachedir']) ? $config['cachedir'] : APPCOMMON.'cache/qrcode/';
		$this->errorlog = isset($config['errorlog']) ? $config['errorlog'] : APPCOMMON.'logs/qrcode/';
		$this->quality = isset($config['quality']) ? $config['quality'] : true;
		$this->size = isset($config['size']) ? $config['size'] : 1024;
		
		// use cache - more disk reads but less CPU power, masks and format templates are stored there
		if (!defined('QR_CACHEABLE')) define('QR_CACHEABLE', $this->cacheable);
		
		// used when QR_CACHEABLE === true
		if (!defined('QR_CACHE_DIR')) define('QR_CACHE_DIR', $this->cachedir);
		
		// default error logs dir
		if (!defined('QR_LOG_DIR')) define('QR_LOG_DIR', $this->errorlog);
		
		// if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
		if ($this->quality) {
			if (!defined('QR_FIND_BEST_MASK')) define('QR_FIND_BEST_MASK', true);
		} else {
			if (!defined('QR_FIND_BEST_MASK')) define('QR_FIND_BEST_MASK', false);
			if (!defined('QR_DEFAULT_MASK')) define('QR_DEFAULT_MASK', $this->quality);
		}
		
		// if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
		if (!defined('QR_FIND_FROM_RANDOM')) define('QR_FIND_FROM_RANDOM', false);
		
		// maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
		if (!defined('QR_PNG_MAXIMUM_SIZE')) define('QR_PNG_MAXIMUM_SIZE',  $this->size);
		
		if($this->cacheable){
			if(!is_dir($this->cachedir)){
				if(!mkdir($this->cachedir, 0775, true)){
					return false;
				}
			}
		}
		
		if(!is_dir($this->errorlog)){
			if(!mkdir($this->errorlog, 0775, true)){
				return false;
			}
		}
	}
	
	private function convert_size($size){
		return $size / 330 * 10 + 0.01;
	}
	
	public function generate($params = array()) {
		if (isset($params['black']) 
			&& is_array($params['black']) 
			&& count($params['black']) == 3 
			&& array_filter($params['black'], 'is_int') === $params['black']) {
			QRimage::$black = $params['black']; 
		}
		
		if (isset($params['white']) 
			&& is_array($params['white']) 
			&& count($params['white']) == 3 
			&& array_filter($params['white'], 'is_int') === $params['white']) {
			QRimage::$white = $params['white']; 
		}
		
		$params['data'] = (isset($params['data'])) ? $params['data'] : 'QR Code Library';
		
		$size = $this->convert_size($params['size'] ? $params['size'] : 330);
		
		if (isset($params['savename'])) {
			$level = 'L';
			if (isset($params['level']) && in_array($params['level'], array('L','M','Q','H'))) $level = $params['level'];
			QRcode::png($params['data'], $params['savename'], $level, $size, 2);
			return $params['savename'];
		} else {
			$level = 'L';
			if (isset($params['level']) && in_array($params['level'], array('L','M','Q','H'))) $level = $params['level'];
			QRcode::png($params['data'], NULL, $level, $size, 2);
		}
	}
	
}

/* end of file */